import java.io.Serializable;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Observable;
import java.util.Map.Entry;



public class Parution extends Observable implements Serializable {

	

	// ************************************************************************************************************
	// Constantes
	// ************************************************************************************************************

	private static final long serialVersionUID = 1L;

	// ************************************************************************************************************
	// Attributs
	// ************************************************************************************************************

		private String _id;
		
		//Attributs d'Association
		private Periodique _periodique;
		private HashMap<Integer, Article> _articles;
		private int _derNumArticle;

		// ************************************************************************************************************
		// Constructeur
		// ************************************************************************************************************

		/**
		 * Constructeur. 
		 * @param issn			numero Issn du periodique
		 * @param titre			titre du periodique
		*/
	
	public Parution(String id, Periodique periodique){
		this.setId(id);
		this.lierPeriodique(periodique);
		this.setArticles(new HashMap<Integer, Article>());
		this.setDerNumArticle(0);
	}// Fin Constructeur
	
	
	// ************************************************************************************************************
			// Méthodes privées
			// ************************************************************************************************************
			
			// ------------------------------------------------------------------------------------------------------------
			// Affecteurs
			
			/**
			 * setter de l'attribut id
			 * @param id valeur à affecter àid de la parution
			 */
		
		private void setId(String id){
			_id = id;
		}
			
		/**
		 * setter de l'attrribut parutions (ensemble des parution du periodique)
		 * @param parutions hashmap de parution
		 */
		private void setArticles(HashMap<Integer, Article> articles) {
			_articles = articles;
		}
	
		private void lierPeriodique(Periodique per){
			_periodique = per;
		} //Fin lierPeriodique
		

		private void lierArticle(Integer id, Article art){
			_articles.put(id, art);
		} //Fin lierArticle

		/*
		 * Ensemble de m�thode pour g�rer l'indexation des articles de la HashMap de parution****************************************************************
		 */
		private void setDerNumArticle(int derNumArticle) {
			_derNumArticle  = derNumArticle ;
		}
		
		private int getDerNumArticle() {
			return _derNumArticle;
		}
				
		/**
		 * Génère un numéro de article.
		 * @return un entier représentant le prochain numéro disponible pour un article de la parution 
		 */
		private int genererNumeroArticle() {
			this.setDerNumArticle(this.getDerNumArticle() + 1);
			return this.getDerNumArticle();
		} // Fin genererNumeroExemplaire************************************************************************************************************************
		

		// ************************************************************************************************************
		// Méthodes publiques
		// ************************************************************************************************************

		// ------------------------------------------------------------------------------------------------------------
		// Accesseurs
		
		/**
		 * Getter de id
		 * @return id de la parution
		 */
		public String getId() {
			return _id;
		}

		
		public Periodique getPeriodique() {
			return _periodique;
		} 
		
	
		/**
		 * getter de l'ensemble des articles.
		 * @return une collection des articles
		 */
		public HashMap<Integer, Article> getArticles() {
			return _articles;
		}
		
		public Article getArticle(String s) {
			Article art = null;
			Article artretour = null;
			for( Entry<Integer, Article> entry : getArticles().entrySet()){
				art = entry.getValue();
				if( art.getTitre().compareTo(s) == 0 ){
					artretour = art;
				}
			}
			return artretour;
		}
		
		
		public Article ajouterArticle(String titre, int pageDebut){
			// Generation du numero chronologique de l'article
			int numero = this.genererNumeroArticle();
			
			//creation de l'article
			Article article = new Article(titre, pageDebut, this);
			
			//liaison du parution � l'article
			this.lierArticle(numero, article);
			return article;
		}
		
	
}
